import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
from unit__003.unit_02.Mysql import Mysql
from time import sleep


class A3mall(unittest.TestCase):
    def setUp(self) -> None:
        print('start case')
        self.db = Mysql(host='10.59.9.12', user='root', password='yidong666', database='a3mall')
        self.driver = webdriver.Edge()
        self.driver.get('http://10.59.9.12:7001/home/index.html')
        self.driver.maximize_window()

    def tearDown(self) -> None:
        print('end case')
        self.db.close()
        sleep(5)
        self.driver.quit()

    def test_01_login(self):
        sleep(2)
        # 点击请登录
        self.driver.find_element(By.XPATH, '/html/body/div[1]/div/div[2]/ul/li[1]/a').click()
        # 输入账号
        self.driver.find_element(By.NAME, 'username').send_keys('18185607777')
        # 输入密码
        self.driver.find_element(By.NAME, 'password').send_keys('123456')
        sleep(10)
        # 点击登录
        self.driver.find_element(By.CLASS_NAME, 'finish-btn').click()
        sleep(5)
        # 断言1 会员中心
        dy1 = self.driver.find_element(By.XPATH, '/html/body/div[4]/a[2]').text
        sleep(2)
        print('断言1:', dy1)
        self.assertEqual('会员中心', dy1)
        # 断言2 数据库断言 提取用户余额和数据库余额对比
        dy2 = self.driver.find_element(By.CLASS_NAME, 'color-black').text
        sleep(2)
        dy2s = dy2.split()
        print('断言2:', dy2s[1])
        result1 = self.db.chaxun(f'select amount from mall_users where username={"18185607777"}')
        print('数据库提取的用户余额:', result1[0][0])
        self.assertEqual(float(dy2s[1]), float(result1[0][0]))
        # 断言3 欢迎回来，18185607777
        dy3 = self.driver.find_element(By.XPATH, '/html/body/div[1]/div/div[2]/ul/li[1]/a').text
        sleep(2)
        print('断言3:', dy3)
        self.assertEqual('欢迎回来，18185607777', dy3)
        # 点击秒杀
        self.driver.find_element(By.XPATH, '/html/body/div[3]/div[2]/ul/li[4]/a').click()
        sleep(2)
        # 提取秒杀列表选择的 商品名称
        spname = self.driver.find_element(By.XPATH, '/html/body/div[5]/div[2]/div[2]/div[1]/ul/li[2]/div[1]/em/a').text
        print('秒杀列表商品名称:', spname)
        # 点击商品
        self.driver.find_element(By.XPATH, '/html/body/div[5]/div[2]/div[2]/div[1]/ul/li[2]/div[1]/span/a/img').click()
        sleep(2)
        # 断言4 将秒杀列表的商品名称和商品详情页的商品名称对比
        dy4 = self.driver.find_element(By.XPATH, '//*[@id="goodsForm"]/div/div[1]/span').text
        print('断言5:', dy4)
        self.assertEqual(spname, dy4)
        # 对商品数量进行清空
        self.driver.find_element(By.ID, 'store_nums').clear()
        sleep(2)
        # 数量框输入数量为2
        self.driver.find_element(By.ID, 'store_nums').send_keys('2')
        sleep(2)
        # 点击立即购买
        self.driver.find_element(By.ID, 'buy-cart').click()
        sleep(2)
        # 断言5 确认订单
        dy5 = self.driver.find_element(By.XPATH, '/html/body/div[4]/div[1]/a[2]').text
        print('断言5：', dy5)
        self.assertTrue('确认订单', dy5)
        sleep(2)
        # 断言6 收货地址
        dy6 = self.driver.find_element(By.CSS_SELECTOR,
                                       '#theForm > div:nth-child(6) > div.take-delivery > div > label').text
        print('断言6：', dy6)
        self.assertIn('小婷 18185603008 北京市,北京市,昌平区 昌平南口南大街', dy6)
        sleep(2)
        # 断言7 支付方式
        dy7 = self.driver.find_element(By.XPATH, '//*[@id="theForm"]/div[3]/div[2]/div[1]/label').text
        print('断言7：', dy7)
        self.assertNotEqual('微信支付', dy7)
        sleep(2)
        # 断言8 商品名称
        dy8 = self.driver.find_element(By.XPATH, '//*[@id="theForm"]/div[4]/div[1]/table/tbody/tr[2]/td[2]/a/p').text
        print('断言8：', dy8)
        self.assertEqual(dy4, dy8)
        sleep(2)
        # 提取商品数量
        sp1num = self.driver.find_element(By.XPATH, '//*[@id="theForm"]/div[4]/div[1]/table/tbody/tr[2]/td[3]').text
        print('商品1购买的数量为:', sp1num)
        sleep(2)
        # 提取商品单价
        sp1price = self.driver.find_element(By.XPATH, '//*[@id="theForm"]/div[4]/div[1]/table/tbody/tr[2]/td[4]').text
        # 对商品单价进行切割 方便运算
        sp1priceS = sp1price.split('￥')
        print('商品1的单价为:', sp1priceS[1])
        sleep(2)
        # 提取运费
        yunfei = self.driver.find_element(By.ID, 'real-freight').text
        yunfeiS = yunfei.split('+')
        print('商品1运费为:', yunfeiS[1])
        sleep(2)
        # 提取总共需要支付的价格
        order_amount = self.driver.find_element(By.ID, 'order-amount').text
        print('订单总价为：', order_amount)
        sleep(2)
        # 计算 商品数量*商品价格+运费 是否等于小计（总支付）+商品运费
        sp1zongjia = (int(sp1num) * float(sp1priceS[1])) + float(yunfeiS[1])
        print('商品1数量*商品价格为+商品运费为:', sp1zongjia)
        sleep(2)
        # 断言9
        # 对提取出来的总支付价格 和 计算出来需要支付的价格 进行对比
        self.assertEqual(float(sp1zongjia), float(order_amount))
        sleep(2)
        # 点击下一步
        self.driver.find_element(By.ID, 'order-button').click()
        sleep(2)
        # 断言10 您的订单支付成功
        dy10 = self.driver.find_element(By.CLASS_NAME, 'succe-ico').text
        print('断言10：', dy10)
        self.assertNotEqual('您的订单支付失败', dy10)
        sleep(2)
        # 点击查看订单
        self.driver.find_element(By.XPATH, '/html/body/div[4]/div[3]/p/a').click()
        sleep(2)
        # 断言11 提取收货地址 查看数据库中是否存在
        dy11 = self.driver.find_element(By.XPATH, '/html/body/div[5]/div[2]/div/div[3]/table/tbody/tr[4]/td[2]').text
        print('断言11：', dy11)
        sleep(2)
        # 点击会员中心
        self.driver.find_element(By.XPATH,'/html/body/div[4]/a[2]').click()
        sleep(2)
        # 提取购买商品后 会员中心的总余额
        sp1yue = self.driver.find_element(By.CLASS_NAME, 'color-black').text
        sleep(2)
        # 提取出来后 进行切割 取金额
        sp1yueS = str(sp1yue).split(' ')
        print(str(sp1yueS[1]))
        sleep(2)
        # 提取出来的余额 和 购买商品计算的余额进行对比 查看是否一致
        # 登录时的余额 - 商品1总支付金额 = 第一次购买商品剩余的余额
        yue1 = float(dy2s[1]) - float(sp1zongjia)
        print(yue1)
        self.assertEqual(float(yue1), float(sp1yueS[1]))
        sleep(2)
        # 查询购买第一次商品后的数据库余额
        # result3 = self.db.chaxun(f'select amount from mall_users where username={"18185607777"}')
        # print('购买后数据库提取的用户余额:', result3)
        # # 对比 购买商品1计算的余额 和 数据库此时的余额是否一致
        # self.assertEqual(float(yue2), float(result3[0][0]))
        # sleep(2)

        # 点击秒杀
        self.driver.find_element(By.XPATH, '/html/body/div[3]/div[2]/ul/li[4]/a').click()
        sleep(2)
        # 点击商品2
        self.driver.find_element(By.XPATH, '/html/body/div[5]/div[2]/div[2]/div[1]/ul/li[3]/div[1]/span/a/img').click()
        sleep(2)
        # 点击立即购买
        self.driver.find_element(By.ID, 'buy-cart').click()
        sleep(2)
        # 提取总共需要支付的价格
        order_amount = self.driver.find_element(By.ID, 'order-amount').text
        print('订单2支付总价为：', order_amount)
        sleep(2)
        # 商品1总支付金额 + 商品2总支付金额 = 购买两件商品总支付金额
        # sp2zongjia = float(sp1zongjia) + float(order_amount)
        # print('商品1数量*商品1价格为+商品1运费为+商品2总支付:', sp2zongjia)
        # 断言12
        # 计算 登录时的用户余额 - 购买2件不同商品的总价 = 用户剩余余额
        # user_yue = float(yue1) - sp2zongjia
        # print(user_yue)
        # sleep(2)
        # # 购买秒杀不同的两个商品后用户余额 和 数据库的用户余额对比
        # result4 = self.db.chaxun(f'select amount from mall_users where username={"18185607777"}')
        # print('数据库余额：', result4)
        # print('购买后数据库提取的用户余额:', result4[0][0])
        # self.assertEqual(float(user_yue), float(result4[0][0]))
        # sleep(2)
        # 点击下一步
        self.driver.find_element(By.ID, 'order-button').click()
        sleep(2)
        # 断言13 您的订单支付成功
        dy13 = self.driver.find_element(By.CLASS_NAME, 'succe-ico').text
        print('断言10：', dy10)
        self.assertNotEqual('您的订单支付失败', dy13)
        sleep(2)
        # 点击查看订单
        self.driver.find_element(By.XPATH, '/html/body/div[4]/div[3]/p/a').click()
        sleep(2)
        # 点击会员中心
        self.driver.find_element(By.XPATH, '/html/body/div[4]/a[2]').click()
        sleep(2)
        # 提取购买商品2后 会员中心的总余额
        sp2yue = self.driver.find_element(By.CLASS_NAME, 'color-black').text
        sleep(2)
        # 提取出来后 进行切割 取金额
        sp2yueS = str(sp2yue).split(' ')
        print(str(sp2yueS[1]))
        sleep(2)
        # 提取出来的余额 和 购买商品计算的余额进行对比 查看是否一致
        # 登录时的余额 - 商品1总支付金额 = 第一次购买商品剩余的余额
        yue2 = float(yue1) - float(order_amount)
        print(yue1)
        self.assertEqual(float(yue2), float(sp2yueS[1]))
        sleep(2)


if __name__ == '__main__':
    unittest.main()
